package luke.core.utils;

import luke.core.config.AppDataManager;

import java.util.Locale;
import java.util.ResourceBundle;
import java.util.MissingResourceException;
import java.text.MessageFormat;

/**
 * 语言管理器类，用于管理应用程序的多语言支持
 */
public class LanguageManager {
    private static final String PREF_LANGUAGE = "language";
    private static final String BASE_NAME = "messages";
    private static LanguageManager instance;
    private ResourceBundle resourceBundle;
    private String currentLanguage;

    private LanguageManager() {
        loadLanguage();
    }

    public static synchronized LanguageManager getInstance() {
        if (instance == null) {
            instance = new LanguageManager();
        }
        return instance;
    }

    /**
     * 加载语言设置
     */
    private void loadLanguage() {
        AppDataManager appDataManager = AppDataManager.getInstance();
        String savedLanguage = appDataManager.getProperties().getProperty(PREF_LANGUAGE, "");
        String systemLanguage = detectSystemLanguage();

        currentLanguage = !savedLanguage.isEmpty() ? savedLanguage : systemLanguage;
        
        try {
            Locale locale = new Locale(currentLanguage);
            resourceBundle = ResourceBundle.getBundle(BASE_NAME, locale);
        } catch (MissingResourceException e) {
            // 如果找不到对应的语言包，默认使用英文
            Locale locale = new Locale("en");
            resourceBundle = ResourceBundle.getBundle(BASE_NAME, locale);
            currentLanguage = "en";
        }
    }

    /**
     * 检测系统语言
     * @return 系统语言代码
     */
    private String detectSystemLanguage() {
        Locale systemLocale = Locale.getDefault();
        String language = systemLocale.getLanguage().toLowerCase();
        
        // 支持的语言列表
        switch (language) {
            case "zh": // 中文
                // 检查是否为繁体中文
                if (systemLocale.getCountry().equals("TW") || systemLocale.getCountry().equals("HK")) {
                    return "zh_TW";
                }
                return "zh";
            case "en": // 英文
                return "en";
            case "ko": // 韩文
                return "ko";
            case "ja": // 日文
                return "ja";
            case "ar": // 阿拉伯语
                return "ar";
            default:
                // 不在支持范围内的语言默认使用英文
                return "en";
        }
    }

    /**
     * 设置语言
     * @param languageCode 语言代码
     */
    public void setLanguage(String languageCode) {
        AppDataManager appDataManager = AppDataManager.getInstance();
        appDataManager.getProperties().setProperty(PREF_LANGUAGE, languageCode);
        appDataManager.saveProperties();
        
        // 更新当前语言和资源包
        currentLanguage = languageCode;
        try {
            Locale locale = new Locale(currentLanguage);
            resourceBundle = ResourceBundle.getBundle(BASE_NAME, locale);
        } catch (MissingResourceException e) {
            // 如果找不到对应的语言包，默认使用英文
            Locale locale = new Locale("en");
            resourceBundle = ResourceBundle.getBundle(BASE_NAME, locale);
            currentLanguage = "en";
        }
    }

    /**
     * 获取当前语言
     * @return 当前语言代码
     */
    public String getCurrentLanguage() {
        return currentLanguage;
    }

    /**
     * 获取本地化字符串
     * @param key 资源键
     * @return 本地化字符串
     */
    public String getString(String key) {
        try {
            return resourceBundle.getString(key);
        } catch (MissingResourceException e) {
            // 如果找不到对应的键，返回键本身
            return key;
        }
    }
    
    /**
     * 获取带参数的本地化字符串
     * @param key 资源键
     * @param params 参数
     * @return 本地化字符串
     */
    public String getString(String key, Object... params) {
        try {
            String pattern = resourceBundle.getString(key);
            return MessageFormat.format(pattern, params);
        } catch (MissingResourceException e) {
            // 如果找不到对应的键，返回键本身
            return key;
        }
    }
    
    /**
     * 获取菜单文本
     * @param key 菜单键
     * @return 本地化菜单文本
     */
    public String getMenuText(String key) {
        return getString("menu." + key);
    }
    
    /**
     * 获取语言设置文本
     * @param key 语言键
     * @return 本地化语言设置文本
     */
    public String getLanguageText(String key) {
        return getString("language." + key);
    }
    
    /**
     * 获取面板文本
     * @param key 面板键
     * @return 本地化面板文本
     */
    public String getPanelText(String key) {
        return getString("panel." + key);
    }
    
    /**
     * 获取带参数的面板文本
     * @param key 面板键
     * @param params 参数
     * @return 本地化面板文本
     */
    public String getPanelText(String key, Object... params) {
        return getString("panel." + key, params);
    }
}